package basis.netease.easy;

import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Stack;

/**
 * 7-14 最小栈
 * 设计一个支持 push ，pop ，top 操作，并能在常数时间内检索到最小元素的栈。
 * 实现 MinStack 类:
 * MinStack() 初始化堆栈对象。
 * void push(int val) 将元素val推入堆栈。
 * void pop() 删除堆栈顶部的元素。
 * int top() 获取堆栈顶部的元素。
 * int getMin() 获取堆栈中的最小元素。
 * 输入格式:
 * 第一行输入是操作的序列，即MinStack类之中的成员函数；
 * 第二行输入是成员函数所对应的参数，若没有参数则输入为 []
 * 输出格式:
 * 输出为对应序列中每个操作的返回值
 * 输入样例:
 * 在这里给出一组输入。例如：
 * push,push,push,getMin,pop,top,getMin
 * -2,0,-3,,,,
 * 输出样例:
 * 在这里给出相应的输出。例如：
 * null,null,null,-3,null,0,-2
 * 解释:
 * MinStack minStack = new MinStack();
 * minStack.push(-2);
 * minStack.push(0);
 * minStack.push(-3);
 * minStack.getMin(); --> 返回 -3.
 * minStack.pop();
 * minStack.top(); --> 返回 0.
 * minStack.getMin(); --> 返回 -2.
 * 提示:
 * -231 <= val <= 231 - 1
 * pop、top 和 getMin 操作总是在 非空栈 上调用
 * push, pop, top, and getMin最多被调用 3 * 104 次
 */
public class Main_11 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] operations = sc.nextLine().split(",");
        String[] inputs = sc.nextLine().split(",");
        MinStack minStack = new MinStack();
        StringBuffer output = new StringBuffer();
        for (int i = 0; i < operations.length; i++) {
            if ("push".equals(operations[i])) {
                minStack.push(Integer.parseInt(inputs[i]));
                output.append("null,");
            } else if ("pop".equals(operations[i])) {
                minStack.pop();
                output.append("null,");
            } else if ("top".equals(operations[i])) {
                int top = minStack.top();
                output.append(top + ",");
            } else if ("getMin".equals(operations[i])) {
                int min = minStack.getMin();
                output.append(min + ",");
            }
        }
        if (output.length() > 0) {
            output.setLength(output.length() - 1);
        }
        System.out.print(output);
    }

    public static class MinStack {
        private Stack<Integer> stack = new Stack<>();
        private final PriorityQueue<Integer> minTree = new PriorityQueue<>();

        void push(int val) {
            stack.push(val);
            minTree.add(val);
        }

        void pop() {
            minTree.remove(stack.pop());
        }

        Integer top() {
            return stack.peek();
        }

        Integer getMin() {
            return minTree.peek();
        }
    }

}
